"""
TCP套接字 HTTP传输, HTTP是应用层服务, TCP是传输层服务. http必须使用tcp传输层协议才能使用.

	http协议(超文本传输协议)
		1. 用途: 网页获取, 数据传输
		2. 特点
			应用层协议, 传输层使用tcp传输
			简单,灵活,很多语言都有http专门接口
			无状态,协议不记录传输内容
			http1.1支持 持久链接, 丰富了请求类型
		3. 网页请求过程
			1.客户端(浏览器)通过tcp传输,发送http请求给服务器
			2.服务器收到http请求后进行解析
			3.服务器处理请求内容,组织响应内容
			4.服务器将响应内容以http响应格式发送给浏览器
			5.浏览器接收到响应内容,解析暂时

	http请求(request):
		请求行: 具体的请求类别和请求内容
			GET     /       http/1.1
			请求类别 请求内容   协议版本
		请求类别: 每个请求类别表示要做不同的事情
			GET: 获取网络资源
			POST: 提交一定的信息,得到反馈
			HEAD: 只获取网络资源的响应头
			PUT: 更新服务器资源
			DELETE: 删除服务器资源
			CONNECT: 预留
			TRACE: 测试
			OPTIONS: 获取服务器性能信息
		请求头: 对请求的进一步解释和描述
			Accept-Encoding: gzip
		空行
		请求体: 请求参数或者提交内容

	http响应(response)
		1. 响应格式: 响应行, 响应头, 空行, 响应体
			响应行: 反馈基本的响应情况
				http/1.1 200 ok
				版本信息 响应码 附加信息
			响应码:
				1xx: 提示信息,表示请求被接收
				2xx: 响应成功
				3xx: 响应需要进一步操作,重定向
				4xx: 客户端错误
				5xx: 服务器错误
			响应头: 对响应内容的描述
				Content-Type: text/html
			响应体: 响应的主体内容信息
"""
from socket import *
import sys

lc = sys.path[0] + "\\index.html"  # 此路径问题只出现在vs code上, python和pycharm都没有问题, 删掉即可
print(lc)

def request(data_):
	"""
	客户端处理
	:param data_:
	"""
	# 获取请求将请求内容提取出来
	data = data_.recv(4096)  # 接收请求
	if not data:  # 如果客户端异常退出,则不处理直接返回
		return
	line_ = data.decode().split('\n')[0]
	sl = line_.split(' ')[1]
	print("切割: ", sl)

	# 判断是不是 / 则返回index.HTML,不是则返回404
	if sl == '/':
		with open(lc, encoding="utf-8") as f:  # 读取文件, 如过不以UTF-8打开,在浏览器上会导致乱码, 因为读取是以gbk模式打开的
			re = "HTTP/1.1 200 ok\r\n"
			re += "Content-Type:text/html\r\n"
			re += "\r\n"
			re += f.read()  # 写入请求体
	else:
		re = "HTTP/1.1 404 Not Found\r\n"
		re += "Content-Type:text/html\r\n"
		re += "\r\n"
		re += "<h1>这个请求超出服务器范围了!</h1>"
	# 发送给客户端
	data_.send(re.encode())



sockfd = socket()
sockfd.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  # 端口重用
sockfd.bind(("127.0.0.1", 8693))
sockfd.listen(5)
print("等待连接...")
while True:
	data, addr = sockfd.accept()
	if not data:
		break
	print(addr)
	request(data)  # 处理客户端请求
	# sockfd.send(so.decode())
sockfd.close()

